#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 错误处理
die() {
    echo -e "${RED}[错误] $1${NC}" >&2
    read -p "按回车键退出..."
    exit 1
}

# 获取本机IP地址
get_local_ip() {
    ip -o -4 addr show | awk '{print $4}' | cut -d'/' -f1 | grep -v '127.0.0.1' | head -n1
}

# 精准系统检测
detect_system() {
    if [ -f /etc/synoinfo.conf ] && [ -d /var/packages ]; then
        echo "dsm"
        return
    fi

    if grep -q "ID=debian" /etc/os-release && ls /vol1* &>/dev/null; then
        echo "fnos"
        return
    fi

    if grep -q "ID=debian" /etc/os-release; then
        echo "debian"
        return
    fi

    if [ -f /etc/os-release ]; then
        echo "linux"
        return
    fi

    echo "unknown"
}

# 获取Docker目录
get_docker_dir() {
    local system_type=$1
    local dir=""

    case $system_type in
        "dsm")
            # 查找现有的 docker 目录，找到就用第一个
            dir=$(find /volume* -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            # 如果没找到，就使用默认路径 /volume1/docker
            [ -z "$dir" ] && dir="/volume1/docker"
            ;;
        "fnos")
            # 查找现有的 docker 目录，找到就用第一个
            dir=$(find /vol*/1000 -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            # 如果没找到，就使用默认路径 /vol1/1000/docker
            [ -z "$dir" ] && dir="/vol1/1000/docker"
            ;;
        *)
            # 其他系统直接使用 /opt/docker
            dir="/opt/docker"
            ;;
    esac

    # 清理路径中的特殊字符
    dir=$(echo "$dir" | tr -d '\n\r')
    
    # 创建目录（如果不存在）
    mkdir -p "$dir" || die "无法创建目录 $dir"
    
    echo "$dir"
}

# 清理数据目录
clean_data_dir() {
    local data_dir="$1"
    
    if [ -d "$data_dir" ]; then
        echo -e "${YELLOW}[注意] 正在删除旧数据目录: ${data_dir}${NC}"
        rm -rf "$data_dir" || die "删除数据目录失败: $data_dir"
        echo -e "${GREEN}[成功] 已删除数据目录${NC}"
    fi
}

# 安装IPTV容器
install_iptv() {
    local base_dir="$1"
    local data_dir="${base_dir}/iptv"
    local m3u_dir="${data_dir}/m3u"
    local update_dir="${data_dir}/update"
    
    # 清理旧数据目录
    clean_data_dir "$data_dir"
    
    # 创建新数据目录
    echo -e "${BLUE}[信息] 创建新数据目录...${NC}"
    mkdir -p "$m3u_dir" || die "无法创建m3u目录: $m3u_dir"
    mkdir -p "$update_dir" || die "无法创建update目录: $update_dir"
    chmod -R 777 "$data_dir" || echo -e "${YELLOW}[警告] 无法设置目录权限${NC}"
    
    echo -e "${BLUE}[信息] 使用Docker目录: ${base_dir}${NC}"
    echo -e "${BLUE}[信息] IPTV数据目录: ${data_dir}${NC}"
    echo -e "${BLUE}[信息] M3U文件目录: ${m3u_dir}${NC}"
    echo -e "${BLUE}[信息] 更新文件目录: ${update_dir}${NC}"

    # 获取端口号
    read -p "请输入要使用的端口号 [默认: 23348]: " port
    port=${port:-23348}
    
    # 验证端口号
    if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
        die "无效的端口号: $port (必须是1-65535之间的数字)"
    fi

    # 检查端口是否被占用
    if ss -tuln | grep -q ":$port "; then
        die "端口 $port 已被占用，请选择其他端口"
    fi

    # 清理旧容器
    if docker ps -aq --filter "name=iptv-sources"; then
        echo -e "${YELLOW}[注意] 移除已存在的iptv-sources容器...${NC}"
        docker stop iptv-sources >/dev/null 2>&1
        docker rm iptv-sources >/dev/null 2>&1
    fi

    # 运行新容器（增加目录映射）
    echo -e "${BLUE}[信息] 正在启动IPTV容器(端口: ${port})...${NC}"
    if ! docker run -d \
        --name iptv-sources \
        --restart=always \
        -v "${data_dir}:/data" \
        -v "${m3u_dir}:/app/m3u" \
        -v "${update_dir}:/app/update" \
        -p ${port}:8080 \
        herberthe0229/iptv-sources:latest; then
        docker logs iptv-sources 2>&1 | head -n 20
        die "启动IPTV容器失败，请检查上方日志"
    fi

    # 验证容器状态
    sleep 3
    if ! docker ps --filter "name=iptv-sources" --format "{{.Status}}" | grep -q "Up"; then
        docker logs iptv-sources 2>&1 | head -n 20
        die "容器启动后异常退出，请检查上方日志"
    fi

    # 创建每日更新脚本（放到update目录）
    create_update_script "$update_dir" "$port" "$data_dir"

    local ip=$(get_local_ip)
    echo -e "\n${GREEN}========== 安装成功 ==========${NC}"
    echo -e "访问地址: ${GREEN}http://${ip}:${port}${NC}"
    echo -e "主数据目录: ${data_dir}"
    echo -e "M3U文件目录: ${m3u_dir}"
    echo -e "更新脚本目录: ${update_dir}"
    echo -e "查看日志: ${YELLOW}docker logs iptv-sources${NC}"
    echo -e "每日更新脚本已创建: ${YELLOW}${update_dir}/update_iptv.sh${NC}"
}

# 创建每日更新脚本
create_update_script() {
    local update_dir="$1"
    local port="$2"
    local data_dir="$3"
    local script_path="${update_dir}/update_iptv.sh"

    cat > "$script_path" << EOF
#!/bin/bash

# 定时构建命令
echo "[$(date)] 开始更新IPTV容器..."
docker stop iptv-sources
docker rm iptv-sources

# 清理数据目录
if [ -d "${data_dir}" ]; then
    echo "[$(date)] 正在删除旧数据目录..."
    rm -rf "${data_dir}" || { echo "[错误] 删除数据目录失败"; exit 1; }
fi

# 重新创建目录结构
mkdir -p "${data_dir}/m3u" || { echo "[错误] 创建m3u目录失败"; exit 1; }
mkdir -p "${data_dir}/update" || { echo "[错误] 创建update目录失败"; exit 1; }
chmod -R 777 "${data_dir}" || echo "[警告] 无法设置目录权限"

# 获取历史版本
UNUSED_IMAGES=\$(docker images -q herberthe0229/iptv-sources --filter "dangling=true")

# 删除历史版本
if [ -n "\$UNUSED_IMAGES" ]; then
    docker rmi \$UNUSED_IMAGES
fi

# 重新加载（保持所有目录映射）
docker run -d --name iptv-sources --restart=always \
    -v "${data_dir}:/data" \
    -v "${data_dir}/m3u:/app/m3u" \
    -v "${data_dir}/update:/app/update" \
    -p ${port}:8080 \
    herberthe0229/iptv-sources:latest
echo "[$(date)] IPTV容器更新完成"
EOF

    chmod +x "$script_path"
    echo -e "${GREEN}[成功] 创建每日更新脚本: ${script_path}${NC}"

    # 添加到/etc/crontab（仅在不存在时添加）
    local cron_entry="15 0   * * *   root    $script_path"
    if ! grep -qF "$script_path" /etc/crontab 2>/dev/null; then
        echo "$cron_entry" | sudo tee -a /etc/crontab >/dev/null
        echo -e "${GREEN}[成功] 已添加到/etc/crontab每日00:15自动执行计划任务${NC}"
        
        # 重启cron服务（不同系统可能不同）
        if command -v systemctl &>/dev/null; then
            sudo systemctl restart cron || sudo systemctl restart crond
        elif command -v service &>/dev/null; then
            sudo service cron restart || sudo service crond restart
        fi
    else
        echo -e "${YELLOW}[注意] 定时任务已存在于/etc/crontab，无需重复添加${NC}"
    fi
}

# 主流程
main() {
    echo -e "${BLUE}=== IPTV自动化安装脚本 ===${NC}"
    
    # 检查Docker
    if ! command -v docker &>/dev/null; then
        die "Docker未安装，请先安装Docker"
    fi
    echo -e "${GREEN}[成功] Docker已安装: $(docker --version | cut -d ',' -f 1)${NC}"

    # 检测系统并获取目录
    system_type=$(detect_system)
    case $system_type in
        "dsm") echo -e "${GREEN}[系统] 检测到群辉DSM${NC}" ;;
        "fnos") echo -e "${GREEN}[系统] 检测到FNOS${NC}" ;;
        "debian") echo -e "${YELLOW}[系统] 检测到Debian${NC}" ;;
        "linux") echo -e "${YELLOW}[系统] 检测到通用Linux${NC}" ;;
        *) echo -e "${YELLOW}[警告] 系统类型未知，使用默认配置${NC}" ;;
    esac

    dir=$(get_docker_dir "$system_type")
    echo -e "${BLUE}[目录] 使用容器目录: ${dir}${NC}"

    # 安装IPTV容器
    install_iptv "$dir"

    read -p "按回车键退出..."
}

main "$@"